Traditional product design methodologies call for the design of a product to be optimized for specific usage patterns, often at the expense of other usage patterns that are deemed to be less relevant. For simple products, the specific usage patterns for which the product is designed may be easy to pre-determine and the design of the product can proceed accordingly, while, for more complex products, product testing may be required to identify usage patterns that represent a “typical” usage pattern towards which the product design is to be directed.
The design of systems comprising computer-executable instructions traditionally follow similar design methodologies. Often systems comprising computer-executable instructions, such as software application programs, or other software components, are subjected to user tests whereby the interaction of users with the application or component is observed. The design of the application or component can be, thereafter, driven by such tests to, for example, optimize the application or component in accordance with usage patterns that are deemed to be “typical”. Often the identification of such usage patterns is based on a statistical analysis of user's behavior, with “typical” usage being that which is most often encountered.
Unfortunately, designing products, including application programs or components comprising computer-executable instructions, for “typical” usage patterns results in design decisions that may produce a sub-optimal design when the product is used in an “atypical” manner. For example, a database product for which a typical usage pattern is found to comprise a large amount of data entry or data editing may be designed in such a manner that such data entry or data editing is performed in an optimal manner, while the ability of that database to perform other, less “typical” tasks efficiently, such as, for example, browsing and displaying data, may be sub-optimal and inefficient.
Because computer-executable application programs and components require various computational resources, such as memory capacity or processor capacity, the traditional solution to the above-described design limitations has been to dynamically adjust the computational resources devoted to a particular application program, component, or other task performed by the execution of computer-executable instructions. Thus, for example, a limited amount of memory or processor capacity can be shared among multiple executing processes by continually monitoring the processes and allowing that process which is most in need of the resources to utilize the resources at that time. Resource managers, therefore, have sought to overcome design limitations by dynamically assigning resources in an optimal manner.